﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entity;
using System.Data;
using System.Configuration;

namespace DataAccess
{
    /// <summary>
    /// 用户登录功能实体类。
    /// </summary>
    public class UserDAL
    {
        private OleDbHelper helper;

        public UserDAL()
        {
            helper = new OleDbHelper();
            helper.ConnectionString = ConfigurationManager.ConnectionStrings["jianbo"].ConnectionString;
        }

        /// <summary>
        /// 用户登录验证。
        /// </summary>
        /// <param name="user">用户</param>
        /// <returns>数据表中第一行第一列</returns>
        public int ValidateUser(User user)
        {
            // 准备SQL语句。
            string sql_text = "SELECT count(user_id) FROM jb_user WHERE @user and @pwd;";

            // 执行并返回数据表中第一行第一列。
            return Convert.ToInt32(helper.ExecuteScalar(sql_text, user.UserName, user.Password).ToString());
        }

        /// <summary>
        /// 用户注册。
        /// </summary>
        /// <param name="user">用户</param>
        /// <returns>受影响的行数</returns>
        public int AddUser(User user)
        {
            //准备SQL语句。
            string sql_text = "INSERT INTO jb_user(user_id, username, `password`, reg_date) VALUES(@id, @user, @pwd, @regdate);";
            //执行并返回受影响的行数。
            return helper.ExecuteNonQuery(sql_text, user.Id, user.UserName, user.Password, user.RegisterDate.ToLongTimeString());
        }

        /// <summary>
        /// 得到所有用户。
        /// </summary>
        /// <returns>用户</returns>
        public List<User> GetAllUsers()
        {
            // 准备SQL语句。
            string sql_text = "SELECT * FROM jb_user;";
            // 获取DataTable对象实例。
            var dtb = helper.GetDataTable(sql_text);
            // LINQ得到List<User>。
            return (from user in dtb.AsEnumerable()
                    select new User()
                    {
                        Id = user.Field<Guid>("user_id"),
                        UserName = user.Field<string>("username"),
                        Password = user.Field<string>("password"),
                        RegisterDate = user.Field<DateTime>("reg_date"),
                        LastedLoginDate = user["lastedlogin_date"] == DBNull.Value ? user.Field<DateTime>("reg_date") : user.Field<DateTime>("lastedlogin_date")
                    }).ToList<User>();
        }

        /// <summary>
        /// 更新用户信息。
        /// </summary>
        /// <param name="user">用户</param>
        /// <returns></returns>
        public int UpdateUser(User user)
        {
            //准备SQL语句。
            string sql_text = "UPDATE jb_user SET username=@uname,`password`=@pwd,reg_date=@rgd,lastedlogin_date=@lld where user_id=@id;";
            //执行并返回受影响的行数。
            return helper.ExecuteNonQuery(sql_text, user.UserName, user.Password, user.RegisterDate.ToLongTimeString(), user.LastedLoginDate.ToLongTimeString(), user.Id);
        }

        /// <summary>
        /// 根据ID获取一个用户实例。
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <returns>用户实例</returns>
        public User GetUserById(Guid id)
        {
            // 准备SQL语句。
            string sql_text = "SELECT * FROM jb_user WHERE user_id=@id;";
            // 获取数据表对象实例。
            var dtb = helper.GetDataTable(sql_text);

            // 返回用户信息。
            return dtb.Rows.Count == 0 ?
                null :
                new User()
                {
                    Id = dtb.Rows[0].Field<Guid>("user_id"),
                    UserName = dtb.Rows[0].Field<string>("username"),
                    Password = dtb.Rows[0].Field<string>("password"),
                    RegisterDate = dtb.Rows[0].Field<DateTime>("reg_date"),
                    LastedLoginDate = dtb.Rows[0].Field<DateTime>("lastedlogin_date")
                };
        }
    }
}